package agenda.dao;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.RollbackException;

import agenda.modelo.Contacto;

public class ContactoDAOJPA implements InterfazContactoDAO {
	
	private EntityManager em;
	private EntityManagerFactory emf;

	public ContactoDAOJPA() {
		emf = Persistence.createEntityManagerFactory("UnidadAgenda");
		em = emf.createEntityManager();
	}
	
	@Override
	public void agregarContacto(Contacto contacto) throws SQLException {
		em.getTransaction().begin();
		em.persist(contacto);
		em.getTransaction().commit();

	}

	@Override
	public boolean eliminarContacto(int IdContacto) throws SQLException {
		em.getTransaction().begin();
		em.remove(this.consultarContacto(IdContacto));
		em.getTransaction().commit();
		return true;  // ??????????????????
	}

	@Override
	public void modificarContacto(Contacto contacto) throws SQLException {
		//??????????????????????
		em.getTransaction().begin();
		em.persist(contacto);
		em.getTransaction().commit();		
	}

	@Override
	public ArrayList<Contacto> listaDeContactos() throws SQLException {
		Query q = em.createQuery("SELECT c FROM Contacto c");
		return new ArrayList<>((List<Contacto>)q.getResultList());
	}

	@Override
	public ArrayList<Contacto> buscarContactosPorNombre(String palabra)
			throws SQLException {
		Query q = em.createQuery("SELECT c FROM Contacto c WHERE c.nombre LIKE '%" + palabra + "%'");
		return new ArrayList<>((List<Contacto>)q.getResultList());
	}

	@Override
	public Contacto consultarContacto(int idContacto) throws SQLException {
		return em.find(Contacto.class, idContacto);
	}

	@Override
	public Contacto[] toArray() throws SQLException {
		return listaDeContactos().toArray(new Contacto[0]);
	}

	@Override
	public String[][] buscarContactosPorNombreToMatriz(String palabra)
			throws SQLException {
		ArrayList<Contacto> lista = buscarContactosPorNombre(palabra);
		String[] filas = new String[lista.size()];
		String[][] resultado;
		resultado = new String[filas.length][];
		for (int i = 0; i < filas.length; i++) {
			resultado[i] = lista.get(i).toArray();
		}
		return resultado;
	}

	@Override
	public int insertaLote(ArrayList<Contacto> lista) throws SQLException {
		try {
			em.getTransaction().begin();
			for (Contacto contacto : lista) {
				em.persist(contacto);
			}
			em.getTransaction().commit();
		} catch (RollbackException e) {
			// TODO: handle exception
			System.out.println("DIO UNA EXCEPCION---CONTROLAR QUE HACER");
			e.printStackTrace();
		}
		
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void cierraConexion() throws SQLException {
		em.close();
		emf.close();
	}

}
